/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.server.bbdd</code> agrupa todas las clases
 * que encapsulan los objetos de acceso a datos (DAO),para realizar el acceso
 * a datos. La base de datos es PostgreSQL.
 */
package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.beans.CFisicaDTO;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.EquipamientoDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.TipoEncuentroDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; 
import java.util.List;

/**
 * La clase <code>MaestrosDAO</code> es el componente de software que suministra
 * la implementación relacionada con la
 * gestión de los listados de las tablas maestras.<br />
 * Extiende la clase <code>DataBaseDAO</code><br />
 *
 * @author	Luis Rodríguez-Manzaneque Sánchez
 * @version	24/11/2011
 * @since	1.00
 * @see         edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException
 */
public class MaestrosDAO extends DataBaseDAO implements IMaestrosDAO {

    /**
     * Constructor de la clase, invoca al constructor de la superclase.
     *
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public MaestrosDAO() throws DataBaseDAOException {
        super();
    }

    /**
     * Devuelve la lista de paises que existen actualmente.
     * @return  La lista de todos los paises de la aplicación
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    @Override
    public List<PaisDTO> listaPaises() throws DataBaseDAOException {
        List<PaisDTO> paises = new ArrayList<PaisDTO>();
        try {
            // Montamos la consulta
            String sSQL = "SELECT idpais,nombre"
                    + " FROM pais"
                    + " ORDER BY nombre";

            // Lanzamos la consulta contra la BBDD
            ResultSet objRS = super.obtenerConsulta(sSQL);

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                PaisDTO inc = new PaisDTO();
                inc.setIdPais(objRS.getInt("idpais"));
                inc.setNomPais(objRS.getString("nombre"));
                paises.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_PAISES_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return paises;
    }

    /**
     * Devuelve la lista de provincias
     * @param	idPais El identificador del pais del que se quieren obtener las provincias
     * @return  La lista de las provincias que pertencen al Provincia indicado
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    @Override
    public List<ProvinciaDTO> listaProvincias(int idPais) throws DataBaseDAOException {
        PreparedStatement pstmtQuery = null;

        List<ProvinciaDTO> provincias = new ArrayList<ProvinciaDTO>();
        try {
            String sSQL = "SELECT idProvincia,idPais,nombre"
                    + " FROM provincia WHERE idPais=? "
                    + " ORDER BY nombre";

            // Montamos la consulta preparada
            pstmtQuery = super.preparedStatement(sSQL);

            // Lanzamos la consulta contra la BBDD
            pstmtQuery.clearParameters();
            pstmtQuery.setInt(1, idPais);
            ResultSet objRS = pstmtQuery.executeQuery();

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                ProvinciaDTO inc = new ProvinciaDTO();
                inc.setIdProvincia(objRS.getInt("idProvincia"));
                inc.setIdPais(objRS.getInt("idPais"));
                inc.setNomProvincia(objRS.getString("nombre"));
                provincias.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

            //Cerramos los PreparedStatement
            pstmtQuery.close();

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_PROVINCIAS_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return provincias;
    }

    /**
     * Devuelve la lista de ciudades
     * @param	idProvincia El identificador del Provincia del que se quieren obtener las ciudades
     * @return  La lista de las ciudades que pertencen a la provincia indicada
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    @Override
    public List<CiudadDTO> listaCiudades(int idProvincia) throws DataBaseDAOException {
        PreparedStatement pstmtQuery = null;
        List<CiudadDTO> ciudades = new ArrayList<CiudadDTO>();
        try {
            // Montamos la consulta
            String sSQL = "SELECT idCiudad,idProvincia,nombre"
                    + " FROM Ciudad"
                    + " WHERE idProvincia=? "
                    + " ORDER BY nombre";

            // Montamos la consulta preparada
            pstmtQuery = super.preparedStatement(sSQL);

            // Lanzamos la consulta contra la BBDD
            pstmtQuery.clearParameters();
            pstmtQuery.setInt(1, idProvincia);
            ResultSet objRS = pstmtQuery.executeQuery();

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                CiudadDTO inc = new CiudadDTO();
                inc.setIdCiudad(objRS.getInt("idCiudad"));
                inc.setIdProvincia(objRS.getInt("idProvincia"));
                inc.setNomCiudad(objRS.getString("nombre"));
                ciudades.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

            //Cerramos los PreparedStatement
            pstmtQuery.close();

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_CIUDADES_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return ciudades;
    }
/**
     * Devuelve la lista de tipos de encuentro que existen actualmente.
     * @return  La lista de todos los tipos de encuentro de la aplicación
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<TipoEncuentroDTO> listaEncuentros() throws DataBaseDAOException {
        List<TipoEncuentroDTO> encuentros = new ArrayList<TipoEncuentroDTO>();
        try {
            // Montamos la consulta
            String sSQL = "SELECT idtencuentro,nombre"
                    + " FROM tipoencuentro"
                    + " ORDER BY nombre";

            // Lanzamos la consulta contra la BBDD
            ResultSet objRS = super.obtenerConsulta(sSQL);

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                TipoEncuentroDTO inc = new TipoEncuentroDTO();
                inc.setNomTipoEncuentro(objRS.getString("nombre"));
                inc.setidTipoEncuentro(objRS.getInt("idtencuentro"));
                encuentros.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_ENCUENTROS_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return encuentros;
    }
    
    /**
     * Devuelve la lista de características físicas que existen actualmente.
     * @return  La lista de todos lcaracterísticas físicas de la aplicación
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<CFisicaDTO> listaCFisicas() throws DataBaseDAOException {
        List<CFisicaDTO> fisicas = new ArrayList<CFisicaDTO>();
        try {
            // Montamos la consulta
            String sSQL = "SELECT idcfisica,nombre"
                    + " FROM cfisica"
                    + " ORDER BY nombre";

            // Lanzamos la consulta contra la BBDD
            ResultSet objRS = super.obtenerConsulta(sSQL);

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                CFisicaDTO inc = new CFisicaDTO();
                inc.setIdCFisica(objRS.getInt("idcfisica"));
                inc.setNomCFisica(objRS.getString("nombre"));
                fisicas.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_ENCUENTROS_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return fisicas;
    }
    
/**
     * Devuelve la lista de equipamiento que existen actualmente.
     * @return  La lista de todos los equipamientos de la aplicación
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public List<EquipamientoDTO> listaEquipamiento() throws DataBaseDAOException {
        List<EquipamientoDTO> equipamiento = new ArrayList<EquipamientoDTO>();
        try {
            // Montamos la consulta
            String sSQL = "SELECT idequipamiento,nombre"
                    + " FROM equipamiento"
                    + " ORDER BY nombre";

            // Lanzamos la consulta contra la BBDD
            ResultSet objRS = super.obtenerConsulta(sSQL);

            // Recorremos el ResultSet para cargar el vector
            while (objRS.next()) {
                EquipamientoDTO inc = new EquipamientoDTO();
                inc.setIdEquipamiento(objRS.getInt("idequipamiento"));
                inc.setnomEquipamiento(objRS.getString("nombre"));
                equipamiento.add(inc);
            }

            // Liberamos recursos
            objRS.close();
            objRS = null;

        } catch (SQLException eS) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_LEER_ENCUENTROS_BBDD
                + Constantes.SL + eS.getMessage());
        } catch (Exception eE) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_MAESTROS_GENERAL
                + Constantes.SL + eE.getMessage());
        }
        return equipamiento;
    }

   /* Llama al método de la clase padre para liberar recursos
     * @see java.lang.Object#finalize() 
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
}
